package tianrun.ziguan.api.calculate.config.service.redis;

import tianrun.ziguan.api.common.exception.RedisConnectException;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface IRedisService {

    /**
     * 获取 key
     *
     * @param pattern 正则
     * @return Set
     */
    Set<String> getKeys(String pattern) throws RedisConnectException;

    /**
     * get命令
     *
     * @param key key
     * @return String
     */
    String get(String key) throws RedisConnectException;

    /**
     * get命令
     *
     * @param key key
     * @return String
     */
    String get(int index, String key) throws RedisConnectException;

    /**
     * mget命令
     *
     * @param key key
     * @return String
     */
    List<String> mGet(String[] key) throws RedisConnectException;

    /**
     * set命令
     *
     * @param key   key
     * @param value value
     * @return String
     */
    String set(String key, String value) throws RedisConnectException;

    /**
     * set命令
     *
     * @param key   key
     * @param value value
     * @return String
     */
    String set(int index, String key, String value) throws RedisConnectException;

    /**
     * set 命令
     *
     * @param key         key
     * @param value       value
     * @param milliscends 毫秒
     * @return String
     */
    String set(String key, String value, Long milliscends) throws RedisConnectException;
    /**
     * set 命令
     *
     * @param key         key
     * @param value       value
     * @param milliscends 毫秒
     * @return String
     */
    String set(int index,String key, String value, Long milliscends) throws RedisConnectException;

    /**
     * del命令
     *
     * @param key key
     * @return Long
     */
    Long del(String key) throws RedisConnectException;

    /**
     * del命令
     *
     * @param key key
     * @return Long
     */
    Long del(int index, String key) throws RedisConnectException;

    /**
     * exists命令
     *
     * @param key key
     * @return Boolean
     */
    Boolean exists(String key) throws RedisConnectException;

    /**
     * pttl命令
     *
     * @param key key
     * @return Long
     */
    Long pttl(String key) throws RedisConnectException;

    /**
     * pexpire命令
     *
     * @param key         key
     * @param milliscends 毫秒
     * @return Long
     */
    Long pexpire(String key, Long milliscends) throws RedisConnectException;

    Long pexpire(int index,String key, Long milliseconds) throws RedisConnectException;

    /**
     * zadd 命令
     *
     * @param key    key
     * @param score  score
     * @param member value
     */
    Long zadd(String key, Double score, String member) throws RedisConnectException;

    /**
     * zrangeByScore 命令
     *
     * @param key key
     * @param min min
     * @param max max
     * @return Set<String>
     */
    Set<String> zrangeByScore(String key, String min, String max) throws RedisConnectException;

    /**
     * zremrangeByScore 命令
     *
     * @param key   key
     * @param start start
     * @param end   end
     * @return Long
     */
    Long zremrangeByScore(String key, String start, String end) throws RedisConnectException;

    /**
     * zrem 命令
     *
     * @param key     key
     * @param members members
     * @return Long
     */
    Long zrem(String key, String... members) throws RedisConnectException;

    /**
     * 获取指定长度的list数据
     *
     * @param key
     * @param start 开始索引
     * @return
     * @
     */
    List<String> getList(String key, int start) throws RedisConnectException;

    /**
     * 获取指定长度的list数据
     *
     * @param key
     * @param start 开始索引
     * @param end   目前指定为当前key的list最大长度
     * @return
     * @
     */
    List<String> getList(String key, int start, int end) throws RedisConnectException;

    /**
     * 添加数据
     *
     * @param key
     * @param value
     * @return
     * @
     */
    void setValue(String key, String... value) throws RedisConnectException;

    void rPush(String key, String... values) throws RedisConnectException;

    /**
     * 批量获取值
     *
     * @param keyList 索引集合
     * @return
     * @
     */
    List<Object> pipelineGetValue(Collection<String> keyList) throws RedisConnectException;

    List<Object> pipelineLRange(Collection<String> keyList) throws RedisConnectException;

    List<Object> pipelineLIndex(Collection<String> keyList, long i) throws RedisConnectException;

    String lindex(String key, long i) throws RedisConnectException;

    String mSet(String[] kvs) throws RedisConnectException;

    List<String> getListIngoreCase(String key, int start) throws RedisConnectException;

    /**
     * hSet 命令
     *
     * @param tableKey 哈希表key名称
     * @param key      哈希表字段key
     * @param value    哈希表key对应值
     * @return Long
     */
    Long hmSet(String tableKey, String key, String value) throws RedisConnectException;

    /**
     * hSet 命令
     *
     * @param index    库
     * @param tableKey 哈希表key名称
     * @param key      哈希表字段key
     * @param value    哈希表key对应值
     * @return Long
     */
    Long hmSet(int index, String tableKey, String key, String value) throws RedisConnectException;


    boolean hmSet(int index, String key, Map<String, String> value);
    boolean hmSet( String key, Map<String, String> value);


    /**
     * hGet 命令
     *
     * @param tableKey 哈希表key名称
     * @param key      哈希表字段key
     * @return Long
     */
    String hGet(String tableKey, String key) throws RedisConnectException;

    /**
     * hgetall命令
     * @param tableKey 哈希表key名称
     * @return
     * @throws RedisConnectException
     */
    public Map<String, String> hGetAll(String tableKey) throws RedisConnectException;
    /**
     * hgetall命令
     * @param index 库
     * @param tableKey 哈希表key名称
     * @return
     * @throws RedisConnectException
     */
    public Map<String, String> hGetAll(int index,String tableKey) throws RedisConnectException;
    /**
     * hGet 命令
     *
     * @param index    库
     * @param tableKey 哈希表key名称
     * @param key      哈希表字段key
     */
    String hGet(int index, String tableKey, String key) throws RedisConnectException;
    List<Object> hGet(int index, String tableKey, Set<String> keys);

    /**
     * hSet 命令
     *
     * @param tableKey 哈希表key名称
     * @param key      哈希表字段key
     * @return Long
     */
    Boolean hExists(String tableKey, String key) throws RedisConnectException;

    /**
     * hSet 命令
     *
     * @param tableKey 哈希表key名称
     * @param key      哈希表字段key
     * @return Long
     */
    Long hdel(String tableKey, String key) throws RedisConnectException;
    /**
     * hSet 命令
     *
     * @param tableKey 哈希表key名称
     * @param key      哈希表字段key
     * @return Long
     */
    Long hdel(int index,String tableKey, String key) throws RedisConnectException;

    /**
     * setnx 命令
     *
     * @param key     键
     * @param value   值
     * @param seconds 过期时间
     * @return boolean
     */
    boolean setnx(String key, String value, int seconds) throws RedisConnectException;

    /**
     * pipelineHSet 命令
     *
     * @param key  键名称
     * @param data 哈希表数据
     * @return Long
     */
    List<Object> pipelineHSet(String key, Map<String, String> data);

    /**
     * pipelineHSet 命令
     *
     * @param index 库
     * @param key   键名称
     * @param data  哈希表数据
     */
    List<Object> pipelineHSet(int index, String key, Map<String, String> data);

    /**
     * pipelineHSet 命令
     *
     * @param index 库
     * @param key   键名称
     * @param data  哈希表数据
     * @param seconds 过期时间秒
     */
    List<Object> pipelineHSet(int index, String key, Map<String, String> data,int seconds);

    /**
     * pipelineHSet 命令
     *
     * @param key     键名称
     * @param mapKeys 哈希表key
     * @return Long
     */
    List<Object> pipelineHGet(String key, Set<String> mapKeys);

    /**
     * pipelineHSet 命令
     *
     * @param index   库
     * @param key     键名称
     * @param mapKeys 哈希表key
     */
    List<Object> pipelineHGet(int index, String key, Set<String> mapKeys);


}
